<?php

/**
 *  chinesespell 类
 *
 * @package lib
 * @subpackage util
 * @author 张立冰 <roast@php.net>
 */
class ChineseSpell {

	/**
	 * @var array $chineseSpellList 拼音编码对应表
	 * @access private
	 */
	private $chineseSpellList = array(
				'a'=>-20319,
				'ai'=>-20317,
				'an'=>-20304,
				'ang'=>-20295,
				'ao'=>-20292,
				'ba'=>-20283,
				'bai'=>-20265,
				'ban'=>-20257,
				'bang'=>-20242,
				'bao'=>-20230,
				'bei'=>-20051,
				'ben'=>-20036,
				'beng'=>-20032,
				'bi'=>-20026,
				'bian'=>-20002,
				'biao'=>-19990,
				'bie'=>-19986,
				'bin'=>-19982,
				'bing'=>-19976,
				'bo'=>-19805,
				'bu'=>-19784,
				'ca'=>-19775,
				'cai'=>-19774,
				'can'=>-19763,
				'cang'=>-19756,
				'cao'=>-19751,
				'ce'=>-19746,
				'ceng'=>-19741,
				'cha'=>-19739,
				'chai'=>-19728,
				'chan'=>-19725,
				'chang'=>-19715,
				'chao'=>-19540,
				'che'=>-19531,
				'chen'=>-19525,
				'cheng'=>-19515,
				'chi'=>-19500,
				'chong'=>-19484,
				'chou'=>-19479,
				'chu'=>-19467,
				'chuai'=>-19289,
				'chuan'=>-19288,
				'chuang'=>-19281,
				'chui'=>-19275,
				'chun'=>-19270,
				'chuo'=>-19263,
				'ci'=>-19261,
				'cong'=>-19249,
				'cou'=>-19243,
				'cu'=>-19242,
				'cuan'=>-19238,
				'cui'=>-19235,
				'cun'=>-19227,
				'cuo'=>-19224,
				'da'=>-19218,
				'dai'=>-19212,
				'dan'=>-19038,
				'dang'=>-19023,
				'dao'=>-19018,
				'de'=>-19006,
				'deng'=>-19003,
				'di'=>-18996,
				'dian'=>-18977,
				'diao'=>-18961,
				'die'=>-18952,
				'ding'=>-18783,
				'diu'=>-18774,
				'dong'=>-18773,
				'dou'=>-18763,
				'du'=>-18756,
				'duan'=>-18741,
				'dui'=>-18735,
				'dun'=>-18731,
				'duo'=>-18722,
				'e'=>-18710,
				'en'=>-18697,
				'er'=>-18696,
				'fa'=>-18526,
				'fan'=>-18518,
				'fang'=>-18501,
				'fei'=>-18490,
				'fen'=>-18478,
				'feng'=>-18463,
				'fo'=>-18448,
				'fou'=>-18447,
				'fu'=>-18446,
				'ga'=>-18239,
				'gai'=>-18237,
				'gan'=>-18231,
				'gang'=>-18220,
				'gao'=>-18211,
				'ge'=>-18201,
				'gei'=>-18184,
				'gen'=>-18183,
				'geng'=>-18181,
				'gong'=>-18012,
				'gou'=>-17997,
				'gu'=>-17988,
				'gua'=>-17970,
				'guai'=>-17964,
				'guan'=>-17961,
				'guang'=>-17950,
				'gui'=>-17947,
				'gun'=>-17931,
				'guo'=>-17928,
				'ha'=>-17922,
				'hai'=>-17759,
				'han'=>-17752,
				'hang'=>-17733,
				'hao'=>-17730,
				'he'=>-17721,
				'hei'=>-17703,
				'hen'=>-17701,
				'heng'=>-17697,
				'hong'=>-17692,
				'hou'=>-17683,
				'hu'=>-17676,
				'hua'=>-17496,
				'huai'=>-17487,
				'huan'=>-17482,
				'huang'=>-17468,
				'hui'=>-17454,
				'hun'=>-17433,
				'huo'=>-17427,
				'ji'=>-17417,
				'jia'=>-17202,
				'jian'=>-17185,
				'jiang'=>-16983,
				'jiao'=>-16970,
				'jie'=>-16942,
				'jin'=>-16915,
				'jing'=>-16733,
				'jiong'=>-16708,
				'jiu'=>-16706,
				'ju'=>-16689,
				'juan'=>-16664,
				'jue'=>-16657,
				'jun'=>-16647,
				'ka'=>-16474,
				'kai'=>-16470,
				'kan'=>-16465,
				'kang'=>-16459,
				'kao'=>-16452,
				'ke'=>-16448,
				'ken'=>-16433,
				'keng'=>-16429,
				'kong'=>-16427,
				'kou'=>-16423,
				'ku'=>-16419,
				'kua'=>-16412,
				'kuai'=>-16407,
				'kuan'=>-16403,
				'kuang'=>-16401,
				'kui'=>-16393,
				'kun'=>-16220,
				'kuo'=>-16216,
				'la'=>-16212,
				'lai'=>-16205,
				'lan'=>-16202,
				'lang'=>-16187,
				'lao'=>-16180,
				'le'=>-16171,
				'lei'=>-16169,
				'leng'=>-16158,
				'li'=>-16155,
				'lia'=>-15959,
				'lian'=>-15958,
				'liang'=>-15944,
				'liao'=>-15933,
				'lie'=>-15920,
				'lin'=>-15915,
				'ling'=>-15903,
				'liu'=>-15889,
				'long'=>-15878,
				'lou'=>-15707,
				'lu'=>-15701,
				'lv'=>-15681,
				'luan'=>-15667,
				'lue'=>-15661,
				'lun'=>-15659,
				'luo'=>-15652,
				'ma'=>-15640,
				'mai'=>-15631,
				'man'=>-15625,
				'mang'=>-15454,
				'mao'=>-15448,
				'me'=>-15436,
				'mei'=>-15435,
				'men'=>-15419,
				'meng'=>-15416,
				'mi'=>-15408,
				'mian'=>-15394,
				'miao'=>-15385,
				'mie'=>-15377,
				'min'=>-15375,
				'ming'=>-15369,
				'miu'=>-15363,
				'mo'=>-15362,
				'mou'=>-15183,
				'mu'=>-15180,
				'na'=>-15165,
				'nai'=>-15158,
				'nan'=>-15153,
				'nang'=>-15150,
				'nao'=>-15149,
				'ne'=>-15144,
				'nei'=>-15143,
				'nen'=>-15141,
				'neng'=>-15140,
				'ni'=>-15139,
				'nian'=>-15128,
				'niang'=>-15121,
				'niao'=>-15119,
				'nie'=>-15117,
				'nin'=>-15110,
				'ning'=>-15109,
				'niu'=>-14941,
				'nong'=>-14937,
				'nu'=>-14933,
				'nv'=>-14930,
				'nuan'=>-14929,
				'nue'=>-14928,
				'nuo'=>-14926,
				'o'=>-14922,
				'ou'=>-14921,
				'pa'=>-14914,
				'pai'=>-14908,
				'pan'=>-14902,
				'pang'=>-14894,
				'pao'=>-14889,
				'pei'=>-14882,
				'pen'=>-14873,
				'peng'=>-14871,
				'pi'=>-14857,
				'pian'=>-14678,
				'piao'=>-14674,
				'pie'=>-14670,
				'pin'=>-14668,
				'ping'=>-14663,
				'po'=>-14654,
				'pu'=>-14645,
				'qi'=>-14630,
				'qia'=>-14594,
				'qian'=>-14429,
				'qiang'=>-14407,
				'qiao'=>-14399,
				'qie'=>-14384,
				'qin'=>-14379,
				'qing'=>-14368,
				'qiong'=>-14355,
				'qiu'=>-14353,
				'qu'=>-14345,
				'quan'=>-14170,
				'que'=>-14159,
				'qun'=>-14151,
				'ran'=>-14149,
				'rang'=>-14145,
				'rao'=>-14140,
				're'=>-14137,
				'ren'=>-14135,
				'reng'=>-14125,
				'ri'=>-14123,
				'rong'=>-14122,
				'rou'=>-14112,
				'ru'=>-14109,
				'ruan'=>-14099,
				'rui'=>-14097,
				'run'=>-14094,
				'ruo'=>-14092,
				'sa'=>-14090,
				'sai'=>-14087,
				'san'=>-14083,
				'sang'=>-13917,
				'sao'=>-13914,
				'se'=>-13910,
				'sen'=>-13907,
				'seng'=>-13906,
				'sha'=>-13905,
				'shai'=>-13896,
				'shan'=>-13894,
				'shang'=>-13878,
				'shao'=>-13870,
				'she'=>-13859,
				'shen'=>-13847,
				'sheng'=>-13831,
				'shi'=>-13658,
				'shou'=>-13611,
				'shu'=>-13601,
				'shua'=>-13406,
				'shuai'=>-13404,
				'shuan'=>-13400,
				'shuang'=>-13398,
				'shui'=>-13395,
				'shun'=>-13391,
				'shuo'=>-13387,
				'si'=>-13383,
				'song'=>-13367,
				'sou'=>-13359,
				'su'=>-13356,
				'suan'=>-13343,
				'sui'=>-13340,
				'sun'=>-13329,
				'suo'=>-13326,
				'ta'=>-13318,
				'tai'=>-13147,
				'tan'=>-13138,
				'tang'=>-13120,
				'tao'=>-13107,
				'te'=>-13096,
				'teng'=>-13095,
				'ti'=>-13091,
				'tian'=>-13076,
				'tiao'=>-13068,
				'tie'=>-13063,
				'ting'=>-13060,
				'tong'=>-12888,
				'tou'=>-12875,
				'tu'=>-12871,
				'tuan'=>-12860,
				'tui'=>-12858,
				'tun'=>-12852,
				'tuo'=>-12849,
				'wa'=>-12838,
				'wai'=>-12831,
				'wan'=>-12829,
				'wang'=>-12812,
				'wei'=>-12802,
				'wen'=>-12607,
				'weng'=>-12597,
				'wo'=>-12594,
				'wu'=>-12585,
				'xi'=>-12556,
				'xia'=>-12359,
				'xian'=>-12346,
				'xiang'=>-12320,
				'xiao'=>-12300,
				'xie'=>-12120,
				'xin'=>-12099,
				'xing'=>-12089,
				'xiong'=>-12074,
				'xiu'=>-12067,
				'xu'=>-12058,
				'xuan'=>-12039,
				'xue'=>-11867,
				'xun'=>-11861,
				'ya'=>-11847,
				'yan'=>-11831,
				'yang'=>-11798,
				'yao'=>-11781,
				'ye'=>-11604,
				'yi'=>-11589,
				'yin'=>-11536,
				'ying'=>-11358,
				'yo'=>-11340,
				'yong'=>-11339,
				'you'=>-11324,
				'yu'=>-11303,
				'yuan'=>-11097,
				'yue'=>-11077,
				'yun'=>-11067,
				'za'=>-11055,
				'zai'=>-11052,
				'zan'=>-11045,
				'zang'=>-11041,
				'zao'=>-11038,
				'ze'=>-11024,
				'zei'=>-11020,
				'zen'=>-11019,
				'zeng'=>-11018,
				'zha'=>-11014,
				'zhai'=>-10838,
				'zhan'=>-10832,
				'zhang'=>-10815,
				'zhao'=>-10800,
				'zhe'=>-10790,
				'zhen'=>-10780,
				'zheng'=>-10764,
				'zhi'=>-10587,
				'zhong'=>-10544,
				'zhou'=>-10533,
				'zhu'=>-10519,
				'zhua'=>-10331,
				'zhuai'=>-10329,
				'zhuan'=>-10328,
				'zhuang'=>-10322,
				'zhui'=>-10315,
				'zhun'=>-10309,
				'zhuo'=>-10307,
				'zi'=>-10296,
				'zong'=>-10281,
				'zou'=>-10274,
				'zu'=>-10270,
				'zuan'=>-10262,
				'zui'=>-10260,
				'zun'=>-10256,
				'zuo'=>-10254
				);
	
	/**
	 * 取汉字所有拼音
	 * @param string $chinese 要转换的汉字
	 * @param string $delimiter 分隔符
	 * @param int $length 返回的长度
	 * @return string
	 */
	public function getFullSpell($chinese, $delimiter = ' ', $length = 0) {
		$spell = $this->getChineseSpells($chinese, $delimiter);
		if ($length) {
			$spell = substr($spell, 0, $length);
		}
		return $spell;
	}
	
	/**
	 * 取汉字第一个拼音
	 * @param string $chinese 要转换的汉字
	 * @param int $length 返回的长度
	 * @return string
	 */
	public function getFirstSpell($chinese, $length = 0) {
		$spell = $this->getChineseSpells($chinese, ' ', 1);
		if ($length) {
			$spell = substr($spell, 0, $length);
		}
		return $spell;
	}

	/**
	 * 取一个汉字码对应的拼音
	 * @param int $num 汉字码
	 * @param string $blank 空白字符
	 * @return string
	 */
	private function getChineseSpell ($num,	$blank = '') {
		if ( $num>0 && $num<160 ) {
			return chr($num);
		} elseif ($num<-20319||$num>-10247) {
			return $blank;
		} else {
			foreach ($this->chineseSpellList as $spell => $code) {
				if ($code > $num) break;
				$result = $spell;
			}
			return $result;
		}
	}

	/**
	 * 取汉字拼音
	 * @param string $chinese 要转换的汉字
	 * @param string $delimiter 分隔符
	 * @param int $first 是否只返回第一个
	 * @return string
	 */
	private function getChineseSpells($chinese, $delimiter = ' ', $first = 0) {
		$result = array();
		for ($i=0; $i<strlen($chinese); $i++) {
			$p = ord(substr($chinese, $i, 1));
			if ($p>160)	{
				$q = ord(substr($chinese, ++$i, 1));
				$p = $p*256 + $q - 65536;
			}
			$result[] = $this->getChineseSpell($p);
			if ($first) {
				return $result[0];
			}
		}
		return implode($delimiter, $result);
	}
}
?>